library(tidyverse) # for data import, manipulation, viz
library(corrplot) # for correlation matix
library(stargazer) # visualize model fit
library(skimr) # generate summary statistics
library(car) # statistics 
library(lmtest) # linear modeling
str(crime_df)
wages_df = crime_df %>% mutate(crmrte_shift = crmrte + 1) %>% 
  select(crmrte_shift, wcon, wtuc, wtrd, wfir, wser, wmfg, wfed, wsta, wloc, taxpc) %>% 
  mutate_all(., log)
cor(wages_df)

wcon: construction wages have high positive correlation with all wages but no correlation with wsta and wser. wtuc: utility wages have high positive correlation with all wages but no correlation with wsta and wser. wtrd: retail wages have high positive correlation with all wages but no correlation with wsta and wser. wfir: finance wages have high positive correlation with all wages but no correlation with wsta and wser. wser: service wages low correlation with all other wages and tax per capita wmfg: manufacturing wages have high positive correlation with all wages but no correlation with wsta and wser. wfed: fed employees wages have high positive correlation with all wages but no correlation with wsta and wser. wsta: state employees wages no correlation with any variable but a bit with fed employees wloc: local government employees wages have high correlation with all wages but wsta taxpc: no correlation with any

ggplot(wages_df, aes(x=log(wcon), y=log(crmrte))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)

Wage Construction and Crime Rate have a high correlation

ggplot(wages_df, aes(x=log(wtuc), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wtrd), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wfir), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wser), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wmfg), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wfed), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wsta), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wloc), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)

Wage Service and Crime Rate have no relationship. It could be because tips are an important part of the Service industry and they are not tracked easily.

ggplot(wages_df, aes(x=log(taxpc), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)

Include wloc and wsta and wtrd.

wtrd and wcon and wfir and wmfg

Then include taxpc.

data2 <- data2 %>% mutate(eff_cj = prbarr*prbconv*prbpris)
model1 = lm(log(crmrte + 1) ~ log(eff_cj) + log(wloc) + log(wsta) + log(wtrd), data = data2)
model1$coefficients
eff_cj_md = lm(log(crmrte) ~ log(eff_cj), data = data2)
eff_cj_md$coefficients
plot(eff_cj_md)
wloc_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc), data = data2)
wloc_md$coefficients
plot(wloc_md)
wloc_tax_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(taxpc), data = data2)
wloc_tax_md$coefficients
plot(wloc_tax_md)
wloc_trd_tax_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wtrd) + log(taxpc), data = data2)
wloc_trd_md$coefficients
plot(wloc_trd_tax_md)

No noticeable improvement from adding wcon

wloc_con_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wcon), data = data2)
wloc_con_md$coefficients
plot(wloc_con_md)

No noticeable improvement by adding wtrd

wloc_trd_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wtrd), data = data2)
wloc_trd_md$coefficients
plot(wloc_trd_md)

No noticible improvement by adding wsta

wloc_sta_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wsta), data = data2)
plot(wloc_sta_md)
wtrd_md = lm(log(crmrte) ~ log(eff_cj) + log(wtrd), data = data2)
wtrd_md$coefficients
(Intercept) log(eff_cj)   log(wtrd) 
 -11.530276   -0.442810    1.249529 
plot(wtrd_md)

deomographics

demo_df =  data2 %>%  select(crmrte, eff_cj, wloc, wtrd, density, pctmin80, pctymle) %>%
  mutate_all(., log)
cor(demo_df)
             crmrte       eff_cj        wloc        wtrd     density     pctmin80      pctymle
crmrte    1.0000000 -0.561313323 0.302867062  0.38965891  0.49364251  0.397290965  0.311754030
eff_cj   -0.5613133  1.000000000 0.007855728 -0.09396993 -0.13895393  0.039442815 -0.372393035
wloc      0.3028671  0.007855728 1.000000000  0.57419433  0.30295286  0.015342980  0.022589116
wtrd      0.3896589 -0.093969928 0.574194331  1.00000000  0.42921817  0.046240863 -0.097848085
density   0.4936425 -0.138953934 0.302952858  0.42921817  1.00000000 -0.018819680  0.175156111
pctmin80  0.3972910  0.039442815 0.015342980  0.04624086 -0.01881968  1.000000000  0.008048105
pctymle   0.3117540 -0.372393035 0.022589116 -0.09784808  0.17515611  0.008048105  1.000000000
wloc_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc), data = data2)
wloc_md$coefficients
(Intercept) log(eff_cj)   log(wloc) 
 -15.692389   -0.471548    1.872709 
plot(wloc_md)

ymale_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(pctymle), data = data2)
ymale_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(pctymle) 
-16.78712764  -0.50121797   2.09661595   0.01214476   0.23631352 
plot(ymale_min_md)

ymale_density_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(density) + log(pctymle), data = data2)
ymale_density_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(density) log(pctymle) 
-13.18459542  -0.47571392   1.41925751   0.01275751   0.15036226   0.09299417 
plot(ymale_density_min_md)

Improves Heteroskedasticity

density_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(density), data = data2)
density_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(density) 
-13.43963749  -0.48599161   1.41756663   0.01282803   0.15215117 
plot(density_min_md)

Improves zero conditional mean and heteroskedasticity significantly

min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 , data = data2)
min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 
-17.55828744  -0.52860856   2.11310007   0.01230844 
plot(min_md)

wtrd_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wtrd) + log(pctmin80) , data = data2)
wtrd_min_md$coefficients
  (Intercept)   log(eff_cj)     log(wtrd) log(pctmin80) 
  -11.8484351    -0.4577432     1.1746727     0.2311788 
plot(wtrd_min_md)

No change after adding pctymle

ymale_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(pctymle), data = data2)
ymale_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc) log(pctymle) 
 -14.7294721   -0.4371883    1.8555659    0.3048858 
plot(ymale_md)

geography

geo_df = data2 %>% mutate(ln_crmrte = log(crmrte), ln_eff_cj = log(eff_cj), ln_wloc = log(wloc), ln_density = log(density), ln_taxpc = log(taxpc)) %>% 
  mutate(west_proper = ifelse(west == 1 & central != 1, 1, 0), central_proper = ifelse(west != 1 & central == 1, 1, 0)) %>% 
  select(ln_crmrte, ln_eff_cj, ln_wloc, ln_density, ln_taxpc, pctmin80, urban, west, central, west_proper)

cor(geo_df)
             ln_crmrte    ln_eff_cj      ln_wloc  ln_density    ln_taxpc    pctmin80       urban        west     central west_proper
ln_crmrte    1.0000000 -0.561313323  0.302867062  0.49364251  0.33984322  0.23291821  0.49146445 -0.41439959  0.18471924 -0.45141763
ln_eff_cj   -0.5613133  1.000000000  0.007855728 -0.13895393 -0.26364343  0.17824194 -0.31631198  0.04357931 -0.05102979  0.07985026
ln_wloc      0.3028671  0.007855728  1.000000000  0.30295286  0.22092405 -0.10213445  0.33004924 -0.12518869  0.33062751 -0.15296513
ln_density   0.4936425 -0.138953934  0.302952858  1.00000000  0.10798692 -0.09668387  0.39272648 -0.21493695  0.28825936 -0.25035461
ln_taxpc     0.3398432 -0.263643431  0.220924053  0.10798692  1.00000000  0.02947733  0.39785937 -0.20386931  0.05466066 -0.19215618
pctmin80     0.2329182  0.178241937 -0.102134449 -0.09668387  0.02947733  1.00000000  0.01619569 -0.63360382 -0.05487554 -0.62451443
urban        0.4914645 -0.316311979  0.330049244  0.39272648  0.39785937  0.01619569  1.00000000 -0.08681219  0.15927023 -0.08000341
west        -0.4143996  0.043579312 -0.125188688 -0.21493695 -0.20386931 -0.63360382 -0.08681219  1.00000000 -0.38987611  0.96990281
central      0.1847192 -0.051029790  0.330627510  0.28825936  0.05466066 -0.05487554  0.15927023 -0.38987611  1.00000000 -0.42986348
west_proper -0.4514176  0.079850262 -0.152965131 -0.25035461 -0.19215618 -0.62451443 -0.08000341  0.96990281 -0.42986348  1.00000000

pctmin80 has high correlation with west but it has opposite impact on crmrte. urban is highly correlated with other variables, exclude. There is some overlap between west or central though they have opposity effects on crmrte. Parse variables. test: pctmin80 vs west_proper.

data2 = data2 %>% mutate(west_proper = ifelse(west == 1 & central != 1, 1, 0))

Benchmark

density_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(density), data = data2)
density_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(density) 
-13.43963749  -0.48599161   1.41756663   0.01282803   0.15215117 
plot(density_min_md)

wtrd_west_md = lm(log(crmrte) ~ log(eff_cj) + log(wtrd) + west_proper, data = data2)
wtrd_west_md$coefficients
(Intercept) log(eff_cj)   log(wtrd) west_proper 
-10.0117863  -0.4244023   0.9955327  -0.4604746 
plot(wtrd_west_md)

west

west_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(density) + west_proper, data = data2)
west_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc) log(density)  west_proper 
 -10.6067960   -0.4155052    1.0338423    0.1179145   -0.4024284 
plot(west_md)

plot(density_min_md$fitted.values, log(data2$crmrte), main = "Actual vs Predicted")
abline(a=0,b=1)

plot(west_md$fitted.values, log(data2$crmrte), main = "Actual vs Predicted")
abline(a=0,b=1)

stargazer(density_min_md, wtrd_west_md, type = "text")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changednumber of rows of result is not a multiple of vector length (arg 2)

=================================================================
                                 Dependent variable:             
                    ---------------------------------------------
                                     log(crmrte)                 
                             (1)                    (2)          
-----------------------------------------------------------------
log(eff_cj)               -0.486***              -0.424***       
                           (0.053)                (0.061)        
                                                                 
log(wloc)                  1.418***                              
                           (0.396)                               
                                                                 
pctmin80                   0.013***                              
                           (0.002)                               
                                                                 
log(density)               0.152***                              
                           (0.026)                               
                                                                 
log(wtrd)                                         0.996***       
                                                  (0.272)        
                                                                 
west_proper                                      -0.460***       
                                                  (0.095)        
                                                                 
Constant                  -13.440***             -10.012***      
                           (2.297)                (1.453)        
                                                                 
-----------------------------------------------------------------
Observations                  90                     90          
R2                          0.677                  0.551         
Adjusted R2                 0.662                  0.536         
Residual Std. Error    0.319 (df = 85)        0.374 (df = 86)    
F Statistic         44.549*** (df = 4; 85) 35.240*** (df = 3; 86)
=================================================================
Note:                                 *p<0.1; **p<0.05; ***p<0.01
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKSAjIGZvciBkYXRhIGltcG9ydCwgbWFuaXB1bGF0aW9uLCB2aXoKbGlicmFyeShjb3JycGxvdCkgIyBmb3IgY29ycmVsYXRpb24gbWF0aXgKbGlicmFyeShzdGFyZ2F6ZXIpICMgdmlzdWFsaXplIG1vZGVsIGZpdApsaWJyYXJ5KHNraW1yKSAjIGdlbmVyYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpsaWJyYXJ5KGNhcikgIyBzdGF0aXN0aWNzIApsaWJyYXJ5KGxtdGVzdCkgIyBsaW5lYXIgbW9kZWxpbmcKYGBgCgpgYGB7cn0Kc3RyKGNyaW1lX2RmKQpgYGAKCmBgYHtyfQp3YWdlc19kZiA9IGNyaW1lX2RmICU+JSBtdXRhdGUoY3JtcnRlX3NoaWZ0ID0gY3JtcnRlICsgMSkgJT4lIAogIHNlbGVjdChjcm1ydGVfc2hpZnQsIHdjb24sIHd0dWMsIHd0cmQsIHdmaXIsIHdzZXIsIHdtZmcsIHdmZWQsIHdzdGEsIHdsb2MsIHRheHBjKSAlPiUgCiAgbXV0YXRlX2FsbCguLCBsb2cpCmNvcih3YWdlc19kZikKYGBgCgpgd2NvbmA6IGNvbnN0cnVjdGlvbiB3YWdlcyBoYXZlIGhpZ2ggcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBhbGwgd2FnZXMgYnV0IG5vIGNvcnJlbGF0aW9uIHdpdGggYHdzdGFgIGFuZCBgd3NlcmAuCmB3dHVjYDogdXRpbGl0eSB3YWdlcyBoYXZlIGhpZ2ggcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBhbGwgd2FnZXMgYnV0IG5vIGNvcnJlbGF0aW9uIHdpdGggYHdzdGFgIGFuZCBgd3NlcmAuCmB3dHJkYDogcmV0YWlsIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdmaXJgOiBmaW5hbmNlIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdzZXJgOiBzZXJ2aWNlIHdhZ2VzIGxvdyBjb3JyZWxhdGlvbiB3aXRoIGFsbCBvdGhlciB3YWdlcyBhbmQgdGF4IHBlciBjYXBpdGEKYHdtZmdgOiBtYW51ZmFjdHVyaW5nIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdmZWRgOiBmZWQgZW1wbG95ZWVzIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdzdGFgOiBzdGF0ZSBlbXBsb3llZXMgd2FnZXMgbm8gY29ycmVsYXRpb24gd2l0aCBhbnkgdmFyaWFibGUgYnV0IGEgYml0IHdpdGggZmVkIGVtcGxveWVlcwpgd2xvY2A6IGxvY2FsIGdvdmVybm1lbnQgZW1wbG95ZWVzIHdhZ2VzIGhhdmUgaGlnaCBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgYHdzdGFgCmB0YXhwY2A6IG5vIGNvcnJlbGF0aW9uIHdpdGggYW55CgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod2NvbiksIHk9bG9nKGNybXJ0ZSkpKSArIAogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKQpgYGAKCldhZ2UgQ29uc3RydWN0aW9uIGFuZCBDcmltZSBSYXRlIGhhdmUgYSBoaWdoIGNvcnJlbGF0aW9uCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod3R1YyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod3RyZCksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod2ZpciksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgoKCmBgYHtyfQpnZ3Bsb3Qod2FnZXNfZGYsIGFlcyh4PWxvZyh3c2VyKSwgeT1sb2coY3JtcnRlICsgMSkpKSArIAogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKQpgYGAKCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod21mZyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgoKYGBge3J9CmdncGxvdCh3YWdlc19kZiwgYWVzKHg9bG9nKHdmZWQpLCB5PWxvZyhjcm1ydGUgKyAxKSkpICsgCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgc2U9RkFMU0UpCmBgYAoKCmBgYHtyfQpnZ3Bsb3Qod2FnZXNfZGYsIGFlcyh4PWxvZyh3c3RhKSwgeT1sb2coY3JtcnRlICsgMSkpKSArIAogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKQpgYGAKCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod2xvYyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpXYWdlIFNlcnZpY2UgYW5kIENyaW1lIFJhdGUgaGF2ZSBubyByZWxhdGlvbnNoaXAuIEl0IGNvdWxkIGJlIGJlY2F1c2UgdGlwcyBhcmUgYW4gaW1wb3J0YW50IHBhcnQgb2YgdGhlIFNlcnZpY2UgaW5kdXN0cnkgYW5kIHRoZXkgYXJlIG5vdCB0cmFja2VkIGVhc2lseS4KCmBgYHtyfQpnZ3Bsb3Qod2FnZXNfZGYsIGFlcyh4PWxvZyh0YXhwYyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpJbmNsdWRlIGB3bG9jYCBhbmQgYHdzdGFgIGFuZCBgd3RyZGAuCgpgd3RyZGAgYW5kIGB3Y29uYCBhbmQgYHdmaXJgIGFuZCBgd21mZ2AgCgpUaGVuIGluY2x1ZGUgYHRheHBjYC4KCmBgYHtyfQpkYXRhMiA8LSBkYXRhMiAlPiUgbXV0YXRlKGVmZl9jaiA9IHByYmFycipwcmJjb252KnByYnByaXMpCmBgYAoKYGBge3J9Cm1vZGVsMSA9IGxtKGxvZyhjcm1ydGUgKyAxKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHdzdGEpICsgbG9nKHd0cmQpLCBkYXRhID0gZGF0YTIpCm1vZGVsMSRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CmVmZl9jal9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaiksIGRhdGEgPSBkYXRhMikKZWZmX2NqX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdChlZmZfY2pfbWQpCmBgYAoKYGBge3J9Cndsb2NfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpLCBkYXRhID0gZGF0YTIpCndsb2NfbWQkY29lZmZpY2llbnRzCmBgYAoKCmBgYHtyfQpwbG90KHdsb2NfbWQpCmBgYAoKYGBge3J9Cndsb2NfdGF4X21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIGxvZyh0YXhwYyksIGRhdGEgPSBkYXRhMikKd2xvY190YXhfbWQkY29lZmZpY2llbnRzCmBgYAoKCmBgYHtyfQpwbG90KHdsb2NfdGF4X21kKQpgYGAKCmBgYHtyfQp3bG9jX3RyZF90YXhfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHd0cmQpICsgbG9nKHRheHBjKSwgZGF0YSA9IGRhdGEyKQp3bG9jX3RyZF9tZCRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CnBsb3Qod2xvY190cmRfdGF4X21kKQpgYGAKCgpObyBub3RpY2VhYmxlIGltcHJvdmVtZW50IGZyb20gYWRkaW5nIGB3Y29uYApgYGB7cn0Kd2xvY19jb25fbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHdjb24pLCBkYXRhID0gZGF0YTIpCndsb2NfY29uX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3bG9jX2Nvbl9tZCkKYGBgCgoKCk5vIG5vdGljZWFibGUgaW1wcm92ZW1lbnQgYnkgYWRkaW5nIGB3dHJkYApgYGB7cn0Kd2xvY190cmRfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHd0cmQpLCBkYXRhID0gZGF0YTIpCndsb2NfdHJkX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3bG9jX3RyZF9tZCkKYGBgCgoKCk5vIG5vdGljaWJsZSBpbXByb3ZlbWVudCBieSBhZGRpbmcgYHdzdGFgCmBgYHtyfQp3bG9jX3N0YV9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaikgKyBsb2cod2xvYykgKyBsb2cod3N0YSksIGRhdGEgPSBkYXRhMikKYGBgCgoKYGBge3J9CnBsb3Qod2xvY19zdGFfbWQpCmBgYAoKCmBgYHtyfQp3dHJkX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3dHJkKSwgZGF0YSA9IGRhdGEyKQp3dHJkX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3dHJkX21kKQpgYGAKCiMgZGVvbW9ncmFwaGljcwoKYGBge3J9CmRlbW9fZGYgPSAgZGF0YTIgJT4lICBzZWxlY3QoY3JtcnRlLCBlZmZfY2osIHdsb2MsIHd0cmQsIGRlbnNpdHksIHBjdG1pbjgwLCBwY3R5bWxlKSAlPiUKICBtdXRhdGVfYWxsKC4sIGxvZykKY29yKGRlbW9fZGYpCmBgYAoKCmBgYHtyfQp3bG9jX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSwgZGF0YSA9IGRhdGEyKQp3bG9jX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3bG9jX21kKQpgYGAKCgpgYGB7cn0KeW1hbGVfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIHBjdG1pbjgwICsgbG9nKHBjdHltbGUpLCBkYXRhID0gZGF0YTIpCnltYWxlX21pbl9tZCRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CnBsb3QoeW1hbGVfbWluX21kKQpgYGAKCmBgYHtyfQp5bWFsZV9kZW5zaXR5X21pbl9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaikgKyBsb2cod2xvYykgKyBwY3RtaW44MCArIGxvZyhkZW5zaXR5KSArIGxvZyhwY3R5bWxlKSwgZGF0YSA9IGRhdGEyKQp5bWFsZV9kZW5zaXR5X21pbl9tZCRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CnBsb3QoeW1hbGVfZGVuc2l0eV9taW5fbWQpCmBgYAoKCgpJbXByb3ZlcyBIZXRlcm9za2VkYXN0aWNpdHkKYGBge3J9CmRlbnNpdHlfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIHBjdG1pbjgwICsgbG9nKGRlbnNpdHkpLCBkYXRhID0gZGF0YTIpCmRlbnNpdHlfbWluX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdChkZW5zaXR5X21pbl9tZCkKYGBgCgoKSW1wcm92ZXMgemVybyBjb25kaXRpb25hbCBtZWFuIGFuZCBoZXRlcm9za2VkYXN0aWNpdHkgc2lnbmlmaWNhbnRseQpgYGB7cn0KbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIHBjdG1pbjgwICwgZGF0YSA9IGRhdGEyKQptaW5fbWQkY29lZmZpY2llbnRzCmBgYAoKCmBgYHtyfQpwbG90KG1pbl9tZCkKYGBgCgoKYGBge3J9Cnd0cmRfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3dHJkKSArIGxvZyhwY3RtaW44MCkgLCBkYXRhID0gZGF0YTIpCnd0cmRfbWluX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3dHJkX21pbl9tZCkKYGBgCgpObyBjaGFuZ2UgYWZ0ZXIgYWRkaW5nIGBwY3R5bWxlYApgYGB7cn0KeW1hbGVfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHBjdHltbGUpLCBkYXRhID0gZGF0YTIpCnltYWxlX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh5bWFsZV9tZCkKYGBgCgojIyBnZW9ncmFwaHkKCgpgYGB7cn0KZ2VvX2RmID0gZGF0YTIgJT4lIG11dGF0ZShsbl9jcm1ydGUgPSBsb2coY3JtcnRlKSwgbG5fZWZmX2NqID0gbG9nKGVmZl9jaiksIGxuX3dsb2MgPSBsb2cod2xvYyksIGxuX2RlbnNpdHkgPSBsb2coZGVuc2l0eSksIGxuX3RheHBjID0gbG9nKHRheHBjKSkgJT4lIAogIG11dGF0ZSh3ZXN0X3Byb3BlciA9IGlmZWxzZSh3ZXN0ID09IDEgJiBjZW50cmFsICE9IDEsIDEsIDApLCBjZW50cmFsX3Byb3BlciA9IGlmZWxzZSh3ZXN0ICE9IDEgJiBjZW50cmFsID09IDEsIDEsIDApKSAlPiUgCiAgc2VsZWN0KGxuX2NybXJ0ZSwgbG5fZWZmX2NqLCBsbl93bG9jLCBsbl9kZW5zaXR5LCBsbl90YXhwYywgcGN0bWluODAsIHVyYmFuLCB3ZXN0LCBjZW50cmFsLCB3ZXN0X3Byb3BlcikKCmNvcihnZW9fZGYpCmBgYApgcGN0bWluODBgIGhhcyBoaWdoIGNvcnJlbGF0aW9uIHdpdGggYHdlc3RgIGJ1dCBpdCBoYXMgb3Bwb3NpdGUgaW1wYWN0IG9uIGBjcm1ydGVgLgpgdXJiYW5gIGlzIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggb3RoZXIgdmFyaWFibGVzLCBleGNsdWRlLgpUaGVyZSBpcyBzb21lIG92ZXJsYXAgYmV0d2VlbiBgd2VzdGAgb3IgYGNlbnRyYWxgIHRob3VnaCB0aGV5IGhhdmUgb3Bwb3NpdHkgZWZmZWN0cyBvbiBgY3JtcnRlYC4gUGFyc2UgdmFyaWFibGVzLiAKdGVzdDogYHBjdG1pbjgwYCB2cyBgd2VzdF9wcm9wZXJgLgoKYGBge3J9CmRhdGEyID0gZGF0YTIgJT4lIG11dGF0ZSh3ZXN0X3Byb3BlciA9IGlmZWxzZSh3ZXN0ID09IDEgJiBjZW50cmFsICE9IDEsIDEsIDApKQpgYGAKCgpCZW5jaG1hcmsKYGBge3J9CmRlbnNpdHlfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIGxvZyhkZW5zaXR5KSArIHBjdG1pbjgwLCBkYXRhID0gZGF0YTIpCmRlbnNpdHlfbWluX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdChkZW5zaXR5X21pbl9tZCkKYGBgCgpgYGB7cn0Kd3RyZF93ZXN0X21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3dHJkKSArIHdlc3RfcHJvcGVyLCBkYXRhID0gZGF0YTIpCnd0cmRfd2VzdF9tZCRjb2VmZmljaWVudHMKYGBgCgpgYGB7cn0KcGxvdCh3dHJkX3dlc3RfbWQpCmBgYAoKd2VzdApgYGB7cn0Kd2VzdF9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaikgKyBsb2cod2xvYykgKyBsb2coZGVuc2l0eSkgKyB3ZXN0X3Byb3BlciwgZGF0YSA9IGRhdGEyKQp3ZXN0X21kJGNvZWZmaWNpZW50cwpgYGAKCmBgYHtyfQpwbG90KHdlc3RfbWQpCmBgYAoKCmBgYHtyfQpwbG90KGRlbnNpdHlfbWluX21kJGZpdHRlZC52YWx1ZXMsIGxvZyhkYXRhMiRjcm1ydGUpLCBtYWluID0gIkFjdHVhbCB2cyBQcmVkaWN0ZWQiKQphYmxpbmUoYT0wLGI9MSkKYGBgCgpgYGB7cn0KcGxvdCh3ZXN0X21kJGZpdHRlZC52YWx1ZXMsIGxvZyhkYXRhMiRjcm1ydGUpLCBtYWluID0gIkFjdHVhbCB2cyBQcmVkaWN0ZWQiKQphYmxpbmUoYT0wLGI9MSkKYGBgCgpgYGB7cn0Kc3RhcmdhemVyKGRlbnNpdHlfbWluX21kLCB3dHJkX3dlc3RfbWQsIHR5cGUgPSAidGV4dCIpCmBgYAoKCgo=